home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / c_toolbx.arc / SMERGE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-03-30  |  1.2 KB  |  44 lines

  1. /*  smerge.c - do a string merge making 1 output run */
  2. #include   "stdio.h"
  3. #include   "merge1.h"
  4.  
  5. int  mergecmp() ;        /* declare finction before ref. */
  6. FILE *do_open() ;
  7. extern    int   (*compfun)  () ;    /* address of compare function */
  8.  
  9. int smerge(md,m,outf)
  10.   MDATA md[] ;            /* file pointer to buffer address */
  11.   int    m ;
  12.   FILE    *outf ;
  13.   {
  14.      int i ;
  15.      MDATA *prec[ MAX_MERGE ] ; /* set up pointers to merge data */
  16.                 /* & get a record from each run */
  17.      for( i=0 ; i<m ; i=i+1 )
  18.     {  prec[i] = & md[i] ;
  19.        getrec(prec[i]->pbuf,MAX_RSIZE,prec[i]->inf) ;
  20.     }  ;
  21.      memsort(prec,m,mergecmp) ; /* sort them (decending order) */
  22.  
  23.      while( m > 0 )        /* repeat until all runs exhausted */
  24.     {            /* write out rec. with lowest key */
  25.        putrec(prec[m-1]->pbuf ,outf) ;
  26.                 /* and read another from same run */
  27.        if( getrec(prec[m-1]->pbuf,MAX_RSIZE,prec[m-1]->inf) <= 0 )
  28.           m = m - 1 ;
  29.        else resort(prec,m,mergecmp) ;
  30.     }
  31.   }
  32.  
  33.  
  34. int  mergecmp(p1,p2)        /* compare function */
  35.   MDATA *p1 ;            /* pointers to merge data */
  36.   MDATA *p2 ;
  37.   {                /* compare strings in buffer areas */
  38.                 /* reverse sign for descending sort */
  39.      return( - (*compfun) (p1->pbuf, p2->pbuf) ) ;
  40.   }
  41.  
  42.  
  43.  
  44.